package com.boil.qz.safekavass.weixin.controller;

import com.boil.pojo.ResultVo;
import com.boil.util.BaseController;
import com.boil.util.Constants;
import com.boil.util.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ChenYong on 2016-10-18.
 * <br>
 * 文件上传 Controller。
 */
@Controller("fileUploadController2")
@RequestMapping("/weixin")
public class FileUploadController extends BaseController {
    /**
     * 上传文件。
     *
     * @param model 模型
     * @param path  上传路径
     * @param file  文件
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.POST, value = "/file/upload.json")
    @ResponseBody
    public ResultVo uploadFile(Model model, String path, MultipartFile file) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        try {
            // 上传路径为空
            if (StringUtils.isBlank(path)) {
                resultVo.setResultCode(Constants.UPLOAD_PATH_EMPTY);
                resultVo.setResultMsg(Constants.UPLOAD_PATH_EMPTY_MSG);

                // 上传路径非空
            } else {
                // 上传路径不正确
                if (!Constants.UPLOAD_DIR_NOTICE.equals(path) && //
                        !Constants.UPLOAD_DIR_LEARN_FILE.equals(path) && //
                        !Constants.UPLOAD_DIR_LEARN_DYM.equals(path) && //
                        !Constants.UPLOAD_DIR_HOME_ADVERT.equals(path) && //
                        !Constants.UPLOAD_DIR_REPORT.equals(path)) {
                    resultVo.setResultCode(Constants.UPLOAD_PATH_ERROR);
                    resultVo.setResultMsg(Constants.UPLOAD_PATH_ERROR_MSG);

                    // 上传路径正确
                } else {
                    // 上传文件为空
                    if ((file == null) || file.isEmpty()) {
                        resultVo.setResultCode(Constants.UPLOAD_FILE_EMPTY);
                        resultVo.setResultMsg(Constants.UPLOAD_FILE_EMPTY_MSG);

                        // 上传文件非空
                    } else {
                        // 文件的长度
                        long fileLength = file.getSize();
                        // 文件旧名称
                        String oldFileName = file.getOriginalFilename();
                        // 文件新名称
                        String newFileName = FileUtils.getNewFileName(file.getOriginalFilename());

                        // 文件的长度超过最大限制
                        if (fileLength > Constants.UPLOAD_FILE_MAX_SIZE_50M) {
                            resultVo.setResultCode(Constants.UPLOAD_FILE_EXCEED_MAX_SIZE);
                            resultVo.setResultMsg(Constants.UPLOAD_FILE_EXCEED_MAX_SIZE_MSG);

                            // 文件的长度未超过最大限制
                        } else {
                            // 获取上传文件的目录
                            File uploadFileDir = new File(request.getSession().getServletContext().getRealPath(String.format("%s/%s/", path, Constants.ADMINISTRATOR_STR)));

                            // 如果目录不存在，则创建
                            if (!uploadFileDir.exists()) {
                                uploadFileDir.mkdirs();
                            }

                            // 创建上传文件的空文件
                            File uploadFile = new File(uploadFileDir, newFileName);
                            // 拷贝，上传完毕
                            file.transferTo(uploadFile);

                            Map<String, String> uploadFileMap = new HashMap<String, String>();
                            uploadFileMap.put("fileName", oldFileName);
                            uploadFileMap.put("filePath", String.format("%s/%s/%s", path, Constants.ADMINISTRATOR_STR, newFileName));

                            resultVo.setResultCode(Constants.SUCCESS);
                            resultVo.setResultMsg(Constants.UPLOAD_SUCCESS_MSG);
                            resultVo.setResult(uploadFileMap);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("微信上传文件出现异常：{}", e);

            resultVo.setResultCode(Constants.SYS_ERROR);
            resultVo.setResultMsg(Constants.SYS_ERROR_MSG);
        }

        return resultVo;
    }
}